/*
 * Compresor.cpp
 *
 *  Created on: 21/06/2010
 *      Author: ignacio
 */

#include "Compresor.h"
#include <iostream>
#include <string.h>

c_aritmetico* Compresor::compresorAritmetico = NULL;

fstream* Compresor::archivoAritmetico = NULL;

char* Compresor::nombreArchivo = NULL;

FILE* file_log=stdout;


void Compresor::setFile(char* rutaArchivo){

	
	if (compresorAritmetico){

		delete compresorAritmetico;
	}

	nombreArchivo = new char[strlen(rutaArchivo)+1];

	strcpy(nombreArchivo,rutaArchivo);
	
	char nombreArchivoLog[512];
	strcpy(nombreArchivoLog,nombreArchivo);
	strcat (nombreArchivoLog,".log");
		
	fprintf(file_log,"NOMBRE DE ARCHIVO: %s",nombreArchivoLog);
	
	if (  !(file_log = fopen(nombreArchivoLog,"w") )) file_log=stdout;
	
	
}

unsigned int Compresor::getTamanioArchivo(){

	return compresorAritmetico->getBitsEmitidos();
}

void Compresor::comprimir(typeCaracterChar caracter,typeFrecuencias frecuenciaCaracter, typeFrecuencias frecuenciaTotal, typeFrecuencias frecuenciaAcumulada, bool fin)
{
	if (!compresorAritmetico){

		archivoAritmetico = new fstream(nombreArchivo,ios::trunc | ios::out | ios::in);

		compresorAritmetico = new c_aritmetico();

		compresorAritmetico->SetFile(archivoAritmetico);

	}

	compresorAritmetico->comprimir(frecuenciaAcumulada,frecuenciaAcumulada+frecuenciaCaracter,frecuenciaTotal);

/*	std::cout << " Caracter a emitir: \"" << caracter << "\" frecuenciaCaracter: \"" << frecuenciaCaracter << "\" frecuencia Total \""<< frecuenciaTotal << "\" frecuencia Acumulada \"" << frecuenciaAcumulada <<"\"\n\n";
*/
        float probabilidad=1;
        
        if(frecuenciaTotal) probabilidad=(float)frecuenciaCaracter/(float)frecuenciaTotal;        
        
	fprintf(file_log,"Emito: 0x%2X  Probabilidad  %3.2f  \n",(unsigned char)caracter,100*probabilidad);
	

	if (fin){

		compresorAritmetico->comprimir_finalizar();
	}
}

typeCaracterAscii Compresor::descomprimir(typeFrecuencias frecuenciaTotal)
{
	if (!compresorAritmetico){

		archivoAritmetico = new fstream(nombreArchivo, ios::out | ios::in);

		compresorAritmetico = new c_aritmetico();

		compresorAritmetico->SetFile(archivoAritmetico);

		compresorAritmetico->descomprimir_iniciar();

	}

	return compresorAritmetico->descomprimirTarget(frecuenciaTotal);
}

typeCaracterAscii Compresor::setFrecuenciasDescomprimir(typeFrecuencias frecuenciaCaracter, typeFrecuencias frecuenciaAcumulada){


	compresorAritmetico->descomprimir(frecuenciaAcumulada, frecuenciaAcumulada+frecuenciaCaracter);
}

void Compresor::destruirCompresor(){

	archivoAritmetico->close();

	delete compresorAritmetico;

	compresorAritmetico = NULL;
	fclose(file_log);

}
